package com.ruoyi.vqms.netty;

import com.ruoyi.vqms.service.IVQMSLedService;
import com.ruoyi.vqms.socket.DeviceChannelMap;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import org.springframework.beans.factory.annotation.Autowired;

import java.nio.charset.StandardCharsets;

public class HearBeatHandler extends ChannelInboundHandlerAdapter {

    @Autowired
    IVQMSLedService ledService;


//    private static final int MAX_LOST_HEARTBEAT = 3; // 最大丢失心跳数
//    private int lostHeartBeatCount = 0; // 当前丢失心跳数
//    private String deviceId = null; // 设备唯一网络ID
//    private ByteBuf lastHeartbeatReq = null; // 保存最后一次收到的心跳请求
//
//    @Override
//    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
//        if (evt instanceof IdleStateEvent) {
//            IdleStateEvent event = (IdleStateEvent) evt;
//
//            if (event.state() == IdleState.READER_IDLE) {
//                // 读空闲增加计数
//                lostHeartBeatCount++;
//                System.out.println("读空闲计数: " + lostHeartBeatCount + ", 设备ID: " + deviceId);
//
//                if (lostHeartBeatCount >= MAX_LOST_HEARTBEAT) {
//                    System.out.println("设备 " + deviceId + " 连续" + MAX_LOST_HEARTBEAT + "个心跳周期无响应，标记为离线");
//                    // 将设备标记为离线状态
////                    updateDeviceStatus(deviceId, false);
//                    ctx.channel().close();
//                }
//            }
//        } else {
//            super.userEventTriggered(ctx, evt);
//        }
//    }
//
//    @Override
//    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//        if (msg instanceof ByteBuf) {
//            ByteBuf buf = (ByteBuf) msg;
//
//            // 检查是否为心跳包
//            if (isHeartbeatPacket(buf)) {
//                // 保存心跳请求用于回复
//                if (lastHeartbeatReq != null) {
//                    lastHeartbeatReq.release();
//                }
//                lastHeartbeatReq = buf.copy();
//
//                // 重置丢失计数
//                lostHeartBeatCount = 0;
//
//                // 提取设备ID
//                extractDeviceId(buf);
//
//                // 原样返回心跳应答
//                System.out.println("收到心跳请求，回复应答帧, 设备ID: " + deviceId);
//                ctx.channel().writeAndFlush(lastHeartbeatReq.duplicate());
//
//                // 更新设备状态为在线
////                updateDeviceStatus(deviceId, true);
//
//                // 心跳包处理完毕，不再继续传递
//                return;
//            }
//        }
//
//        // 非心跳包，继续正常处理
//        super.channelRead(ctx, msg);
//    }
//
//    @Override
//    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
//        System.out.println("设备连接断开, 设备ID: " + deviceId);
////        updateDeviceStatus(deviceId, false);
//
//        if (lastHeartbeatReq != null) {
//            lastHeartbeatReq.release();
//            lastHeartbeatReq = null;
//        }
//
//        super.channelInactive(ctx);
//    }
//
//    // 判断是否为心跳包
//    private boolean isHeartbeatPacket(ByteBuf buf) {
//        // 心跳包至少需要包含帧头(2字节)和操作码(2字节)
//        if (buf.readableBytes() >= 4) {
//            // 保存当前读指针位置
//            int readerIndex = buf.readerIndex();
//
//            try {
//                // 检查帧头
//                short header = buf.getShort(readerIndex);
//                if (header == 0x55AA) {
//                    // 检查操作码(心跳包操作码为0x00D8)
//                    short opcode = buf.getShort(readerIndex + 6);
//                    return opcode == 0x00D8;
//                }
//            } finally {
//                // 恢复读指针位置
//                buf.readerIndex(readerIndex);
//            }
//        }
//        return false;
//    }
//
//    // 从心跳包中提取设备ID
//    private void extractDeviceId(ByteBuf buf) {
//        // 设备ID通常从第18字节开始，长度为16字节
//        if (buf.readableBytes() >= 34) {
//            int readerIndex = buf.readerIndex();
//
//            try {
//                // 跳过前面的18字节
//                ByteBuf deviceIdBuf = buf.copy(readerIndex + 18, 16);
//                byte[] deviceIdBytes = new byte[16];
//                deviceIdBuf.readBytes(deviceIdBytes);
//                deviceIdBuf.release();
//
//                // 转换为字符串并去除空格
//                deviceId = new String(deviceIdBytes, StandardCharsets.US_ASCII).trim();
//                System.out.println("提取到设备ID: " + deviceId);
//            } finally {
//                // 恢复读指针位置
//                buf.readerIndex(readerIndex);
//            }
//        }
//    }

    // 更新设备状态
//    private void updateDeviceStatus(String deviceId, boolean isOnline) {
//        if (deviceId != null && !deviceId.isEmpty()) {
//            if (isOnline) {
//                // 设备上线，保存设备与通道的映射
//                DeviceChannelMap.put(deviceId, ctx.channel());
//                // 记录设备在线状态到Redis
//                redisCache.setCacheObject(DEVICE_LINK_IP + deviceId,
//                        InetAddress.getLocalHost().getHostAddress());
//                redisCache.expire(DEVICE_LINK_IP + deviceId, 365, TimeUnit.DAYS);
//            } else {
//                // 设备离线，移除映射
//                DeviceChannelMap.remove(deviceId);
//                // 从在线列表中移除
//                redisCache.deleteObject(DEVICE_LINK_IP + deviceId);
//            }
//        }
//    }


    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if(evt instanceof IdleStateEvent) {
            IdleStateEvent idleStateEvent = (IdleStateEvent)evt;


            if(idleStateEvent.state() == IdleState.READER_IDLE) {
//                System.out.println("读空闲事件触发...");
                //刷新LED大屏
//                try {
//                    ledService.flushLesScreenData(1L);
//                    ledService.flushLesScreenData(41L);
//                } catch (Exception e) {
//                    System.out.println("读空闲主动刷新LED大屏失败");
//                    e.printStackTrace();
//                }
            }
            else if(idleStateEvent.state() == IdleState.WRITER_IDLE) {
//                System.out.println("写空闲事件触发...");
                //刷新LED大屏
//                try {
//                    ledService.flushLesScreenData(1L);
//                    ledService.flushLesScreenData(41L);
//                } catch (Exception e) {
//                    System.out.println("写空闲主动刷新LED大屏失败");
//                    e.printStackTrace();
//                }
            }
            else if(idleStateEvent.state() == IdleState.ALL_IDLE) {
                System.out.println("-------关闭WebSocket通道资源--------");
//                System.out.println("读写空闲事件触发");
//                System.out.println("关闭WebSocket通道资源");

                //注释掉保持长连接，若占用资源大可放开
                ctx.channel().close();
            }
        }
    }
}
